home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / lib / python2.5 / test / regrtest.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-29  |  37KB  |  915 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. '''Regression test.
  5.  
  6. This will find all modules whose name is "test_*" in the test
  7. directory, and run them.  Various command line options provide
  8. additional facilities.
  9.  
  10. Command line options:
  11.  
  12. -v: verbose    -- run tests in verbose mode with output to stdout
  13. -w: verbose2   -- re-run failed tests in verbose mode
  14. -q: quiet      -- don\'t print anything except if a test fails
  15. -g: generate   -- write the output file for a test instead of comparing it
  16. -x: exclude    -- arguments are tests to *exclude*
  17. -s: single     -- run only a single test (see below)
  18. -r: random     -- randomize test execution order
  19. -f: fromfile   -- read names of tests to run from a file (see below)
  20. -l: findleaks  -- if GC is available detect tests that leak memory
  21. -u: use        -- specify which special resource intensive tests to run
  22. -h: help       -- print this text and exit
  23. -t: threshold  -- call gc.set_threshold(N)
  24. -T: coverage   -- turn on code coverage using the trace module
  25. -D: coverdir   -- Directory where coverage files are put
  26. -N: nocoverdir -- Put coverage files alongside modules
  27. -L: runleaks   -- run the leaks(1) command just before exit
  28. -R: huntrleaks -- search for reference leaks (needs debug build, v. slow)
  29. -M: memlimit   -- run very large memory-consuming tests
  30.  
  31. If non-option arguments are present, they are names for tests to run,
  32. unless -x is given, in which case they are names for tests not to run.
  33. If no test names are given, all tests are run.
  34.  
  35. -v is incompatible with -g and does not compare test output files.
  36.  
  37. -T turns on code coverage tracing with the trace module.
  38.  
  39. -D specifies the directory where coverage files are put.
  40.  
  41. -N Put coverage files alongside modules.
  42.  
  43. -s means to run only a single test and exit.  This is useful when
  44. doing memory analysis on the Python interpreter (which tend to consume
  45. too many resources to run the full regression test non-stop).  The
  46. file /tmp/pynexttest is read to find the next test to run.  If this
  47. file is missing, the first test_*.py file in testdir or on the command
  48. line is used.  (actually tempfile.gettempdir() is used instead of
  49. /tmp).
  50.  
  51. -f reads the names of tests from the file given as f\'s argument, one
  52. or more test names per line.  Whitespace is ignored.  Blank lines and
  53. lines beginning with \'#\' are ignored.  This is especially useful for
  54. whittling down failures involving interactions among tests.
  55.  
  56. -L causes the leaks(1) command to be run just before exit if it exists.
  57. leaks(1) is available on Mac OS X and presumably on some other
  58. FreeBSD-derived systems.
  59.  
  60. -R runs each test several times and examines sys.gettotalrefcount() to
  61. see if the test appears to be leaking references.  The argument should
  62. be of the form stab:run:fname where \'stab\' is the number of times the
  63. test is run to let gettotalrefcount settle down, \'run\' is the number
  64. of times further it is run and \'fname\' is the name of the file the
  65. reports are written to.  These parameters all have defaults (5, 4 and
  66. "reflog.txt" respectively), so the minimal invocation is \'-R ::\'.
  67.  
  68. -M runs tests that require an exorbitant amount of memory. These tests
  69. typically try to ascertain containers keep working when containing more than
  70. 2 billion objects, which only works on 64-bit systems. There are also some
  71. tests that try to exhaust the address space of the process, which only makes
  72. sense on 32-bit systems with at least 2Gb of memory. The passed-in memlimit,
  73. which is a string in the form of \'2.5Gb\', determines howmuch memory the
  74. tests will limit themselves to (but they may go slightly over.) The number
  75. shouldn\'t be more memory than the machine has (including swap memory). You
  76. should also keep in mind that swap memory is generally much, much slower
  77. than RAM, and setting memlimit to all available RAM or higher will heavily
  78. tax the machine. On the other hand, it is no use running these tests with a
  79. limit of less than 2.5Gb, and many require more than 20Gb. Tests that expect
  80. to use more than memlimit memory will be skipped. The big-memory tests
  81. generally run very, very long.
  82.  
  83. -u is used to specify which special resource intensive tests to run,
  84. such as those requiring large file support or network connectivity.
  85. The argument is a comma-separated list of words indicating the
  86. resources to test.  Currently only the following are defined:
  87.  
  88.     all -       Enable all special resources.
  89.  
  90.     audio -     Tests that use the audio device.  (There are known
  91.                 cases of broken audio drivers that can crash Python or
  92.                 even the Linux kernel.)
  93.  
  94.     curses -    Tests that use curses and will modify the terminal\'s
  95.                 state and output modes.
  96.  
  97.     largefile - It is okay to run some test that may create huge
  98.                 files.  These tests can take a long time and may
  99.                 consume >2GB of disk space temporarily.
  100.  
  101.     network -   It is okay to run tests that use external network
  102.                 resource, e.g. testing SSL support for sockets.
  103.  
  104.     bsddb -     It is okay to run the bsddb testsuite, which takes
  105.                 a long time to complete.
  106.  
  107.     decimal -   Test the decimal module against a large suite that
  108.                 verifies compliance with standards.
  109.  
  110.     compiler -  Test the compiler package by compiling all the source
  111.                 in the standard library and test suite.  This takes
  112.                 a long time.  Enabling this resource also allows
  113.                 test_tokenize to verify round-trip lexing on every
  114.                 file in the test library.
  115.  
  116.     subprocess  Run all tests for the subprocess module.
  117.  
  118.     urlfetch -  It is okay to download files required on testing.
  119.  
  120. To enable all resources except one, use \'-uall,-<resource>\'.  For
  121. example, to run all the tests except for the bsddb tests, give the
  122. option \'-uall,-bsddb\'.
  123. '''
  124. import os
  125. import sys
  126. import getopt
  127. import random
  128. import warnings
  129. import re
  130. import cStringIO
  131. import traceback
  132. warnings.filterwarnings('ignore', 'hex/oct constants', FutureWarning, '.*test.test_grammar$')
  133. if sys.maxint > 2147483647:
  134.     warnings.filterwarnings('ignore', 'hex/oct constants', FutureWarning, '<string>')
  135.  
  136. for mod in ('ctypes', 'gzip', 'zipfile', 'tarfile', 'encodings.zlib_codec', 'test.test_zipimport', 'test.test_zlib', 'test.test_zipfile', 'test.test_codecs', 'test.string_tests'):
  137.     warnings.filterwarnings(module = '.*%s$' % (mod,), action = 'ignore', category = ImportWarning)
  138.  
  139. if sys.platform == 'darwin':
  140.     
  141.     try:
  142.         import resource
  143.     except ImportError:
  144.         pass
  145.  
  146.     (soft, hard) = resource.getrlimit(resource.RLIMIT_STACK)
  147.     newsoft = min(hard, max(soft, 1024 * 2048))
  148.     resource.setrlimit(resource.RLIMIT_STACK, (newsoft, hard))
  149.  
  150. from test import test_support
  151. RESOURCE_NAMES = ('audio', 'curses', 'largefile', 'network', 'bsddb', 'decimal', 'compiler', 'subprocess', 'urlfetch')
  152.  
  153. def usage(code, msg = ''):
  154.     print __doc__
  155.     if msg:
  156.         print msg
  157.     
  158.     sys.exit(code)
  159.  
  160.  
  161. def main(tests = None, testdir = None, verbose = 0, quiet = False, generate = False, exclude = False, single = False, randomize = False, fromfile = None, findleaks = False, use_resources = None, trace = False, coverdir = 'coverage', runleaks = False, huntrleaks = False, verbose2 = False):
  162.     """Execute a test suite.
  163.  
  164.     This also parses command-line options and modifies its behavior
  165.     accordingly.
  166.  
  167.     tests -- a list of strings containing test names (optional)
  168.     testdir -- the directory in which to look for tests (optional)
  169.  
  170.     Users other than the Python test suite will certainly want to
  171.     specify testdir; if it's omitted, the directory containing the
  172.     Python test suite is searched for.
  173.  
  174.     If the tests argument is omitted, the tests listed on the
  175.     command-line will be used.  If that's empty, too, then all *.py
  176.     files beginning with test_ will be used.
  177.  
  178.     The other default arguments (verbose, quiet, generate, exclude, single,
  179.     randomize, findleaks, use_resources, trace and coverdir) allow programmers
  180.     calling main() directly to set the values that would normally be set by
  181.     flags on the command line.
  182.     """
  183.     test_support.record_original_stdout(sys.stdout)
  184.     
  185.     try:
  186.         (opts, args) = getopt.getopt(sys.argv[1:], 'hvgqxsrf:lu:t:TD:NLR:wM:', [
  187.             'help',
  188.             'verbose',
  189.             'quiet',
  190.             'generate',
  191.             'exclude',
  192.             'single',
  193.             'random',
  194.             'fromfile',
  195.             'findleaks',
  196.             'use=',
  197.             'threshold=',
  198.             'trace',
  199.             'coverdir=',
  200.             'nocoverdir',
  201.             'runleaks',
  202.             'huntrleaks=',
  203.             'verbose2',
  204.             'memlimit='])
  205.     except getopt.error:
  206.         msg = None
  207.         usage(2, msg)
  208.  
  209.     if use_resources is None:
  210.         use_resources = []
  211.     
  212.     for o, a in opts:
  213.         if o in ('-h', '--help'):
  214.             usage(0)
  215.             continue
  216.         if o in ('-v', '--verbose'):
  217.             verbose += 1
  218.             continue
  219.         if o in ('-w', '--verbose2'):
  220.             verbose2 = True
  221.             continue
  222.         if o in ('-q', '--quiet'):
  223.             quiet = True
  224.             verbose = 0
  225.             continue
  226.         if o in ('-g', '--generate'):
  227.             generate = True
  228.             continue
  229.         if o in ('-x', '--exclude'):
  230.             exclude = True
  231.             continue
  232.         if o in ('-s', '--single'):
  233.             single = True
  234.             continue
  235.         if o in ('-r', '--randomize'):
  236.             randomize = True
  237.             continue
  238.         if o in ('-f', '--fromfile'):
  239.             fromfile = a
  240.             continue
  241.         if o in ('-l', '--findleaks'):
  242.             findleaks = True
  243.             continue
  244.         if o in ('-L', '--runleaks'):
  245.             runleaks = True
  246.             continue
  247.         if o in ('-t', '--threshold'):
  248.             import gc as gc
  249.             gc.set_threshold(int(a))
  250.             continue
  251.         if o in ('-T', '--coverage'):
  252.             trace = True
  253.             continue
  254.         if o in ('-D', '--coverdir'):
  255.             coverdir = os.path.join(os.getcwd(), a)
  256.             continue
  257.         None if o in ('-N', '--nocoverdir') else len(huntrleaks[2]) == 0
  258.         if o in ('-M', '--memlimit'):
  259.             test_support.set_memlimit(a)
  260.             continue
  261.         if o in ('-u', '--use'):
  262.             u = [ x.lower() for x in a.split(',') ]
  263.             for r in u:
  264.                 remove = False
  265.                 if r[0] == '-':
  266.                     remove = True
  267.                     r = r[1:]
  268.                 
  269.                 if r not in RESOURCE_NAMES:
  270.                     usage(1, 'Invalid -u/--use option: ' + a)
  271.                 
  272.                 if remove:
  273.                     if r in use_resources:
  274.                         use_resources.remove(r)
  275.                     
  276.                 r in use_resources
  277.                 if r not in use_resources:
  278.                     use_resources.append(r)
  279.                     continue
  280.             
  281.     
  282.     if generate and verbose:
  283.         usage(2, "-g and -v don't go together!")
  284.     
  285.     if single and fromfile:
  286.         usage(2, "-s and -f don't go together!")
  287.     
  288.     good = []
  289.     bad = []
  290.     skipped = []
  291.     resource_denieds = []
  292.     if findleaks:
  293.         
  294.         try:
  295.             import gc as gc
  296.         except ImportError:
  297.             print 'No GC available, disabling findleaks.'
  298.             findleaks = False
  299.  
  300.         found_garbage = []
  301.     
  302.     if single:
  303.         gettempdir = gettempdir
  304.         import tempfile
  305.         filename = os.path.join(gettempdir(), 'pynexttest')
  306.         
  307.         try:
  308.             fp = open(filename, 'r')
  309.             next = fp.read().strip()
  310.             tests = [
  311.                 next]
  312.             fp.close()
  313.         except IOError:
  314.             pass
  315.         except:
  316.             None<EXCEPTION MATCH>IOError
  317.         
  318.  
  319.     None<EXCEPTION MATCH>IOError
  320.     if fromfile:
  321.         tests = []
  322.         fp = open(fromfile)
  323.         for line in fp:
  324.             guts = line.split()
  325.             if guts and not guts[0].startswith('#'):
  326.                 tests.extend(guts)
  327.                 continue
  328.         
  329.         fp.close()
  330.     
  331.     if args:
  332.         args = map(removepy, args)
  333.     
  334.     if tests:
  335.         tests = map(removepy, tests)
  336.     
  337.     stdtests = STDTESTS[:]
  338.     nottests = NOTTESTS[:]
  339.     if exclude:
  340.         for arg in args:
  341.             if arg in stdtests:
  342.                 stdtests.remove(arg)
  343.                 continue
  344.         
  345.         nottests[:0] = args
  346.         args = []
  347.     
  348.     if not tests and args:
  349.         pass
  350.     tests = findtests(testdir, stdtests, nottests)
  351.     if single:
  352.         tests = tests[:1]
  353.     
  354.     if randomize:
  355.         random.shuffle(tests)
  356.     
  357.     if trace:
  358.         import trace
  359.         tracer = trace.Trace(ignoredirs = [
  360.             sys.prefix,
  361.             sys.exec_prefix], trace = False, count = True)
  362.     
  363.     test_support.verbose = verbose
  364.     test_support.use_resources = use_resources
  365.     save_modules = sys.modules.keys()
  366.     for test in tests:
  367.         if not quiet:
  368.             print test
  369.             sys.stdout.flush()
  370.         
  371.         if trace:
  372.             tracer.runctx('runtest(test, generate, verbose, quiet, testdir)', globals = globals(), locals = vars())
  373.         else:
  374.             
  375.             try:
  376.                 ok = runtest(test, generate, verbose, quiet, testdir, huntrleaks)
  377.             except KeyboardInterrupt:
  378.                 print 
  379.                 break
  380.             except:
  381.                 raise 
  382.  
  383.             if ok > 0:
  384.                 good.append(test)
  385.             elif ok == 0:
  386.                 bad.append(test)
  387.             else:
  388.                 skipped.append(test)
  389.                 if ok == -2:
  390.                     resource_denieds.append(test)
  391.                 
  392.         if findleaks:
  393.             gc.collect()
  394.             if gc.garbage:
  395.                 print 'Warning: test created', len(gc.garbage), 'uncollectable object(s).'
  396.                 found_garbage.extend(gc.garbage)
  397.                 del gc.garbage[:]
  398.             
  399.         
  400.         for module in sys.modules.keys():
  401.             if module not in save_modules and module.startswith('test.'):
  402.                 test_support.unload(module)
  403.                 continue
  404.         
  405.     
  406.     good.sort()
  407.     bad.sort()
  408.     skipped.sort()
  409.     if good and not quiet:
  410.         if not bad and not skipped and len(good) > 1:
  411.             print 'All',
  412.         
  413.         print count(len(good), 'test'), 'OK.'
  414.         if verbose:
  415.             print "CAUTION:  stdout isn't compared in verbose mode:"
  416.             print 'a test that passes in verbose mode may fail without it.'
  417.         
  418.     
  419.     if bad:
  420.         print count(len(bad), 'test'), 'failed:'
  421.         printlist(bad)
  422.     
  423.     if skipped and not quiet:
  424.         print count(len(skipped), 'test'), 'skipped:'
  425.         printlist(skipped)
  426.         e = _ExpectedSkips()
  427.         plat = sys.platform
  428.         if e.isvalid():
  429.             surprise = set(skipped) - e.getexpected() - set(resource_denieds)
  430.             if surprise:
  431.                 print count(len(surprise), 'skip'), 'unexpected on', plat + ':'
  432.                 printlist(surprise)
  433.             else:
  434.                 print 'Those skips are all expected on', plat + '.'
  435.         else:
  436.             print 'Ask someone to teach regrtest.py about which tests are'
  437.             print 'expected to get skipped on', plat + '.'
  438.     
  439.     if verbose2 and bad:
  440.         print 'Re-running failed tests in verbose mode'
  441.         for test in bad:
  442.             print 'Re-running test %r in verbose mode' % test
  443.             sys.stdout.flush()
  444.             
  445.             try:
  446.                 test_support.verbose = 1
  447.                 ok = runtest(test, generate, 1, quiet, testdir, huntrleaks)
  448.             continue
  449.             except KeyboardInterrupt:
  450.                 print 
  451.                 break
  452.                 continue
  453.                 raise 
  454.                 continue
  455.             
  456.  
  457.         
  458.     
  459.     if single:
  460.         alltests = findtests(testdir, stdtests, nottests)
  461.         for i in range(len(alltests)):
  462.             if tests[0] == alltests[i]:
  463.                 if i == len(alltests) - 1:
  464.                     os.unlink(filename)
  465.                 else:
  466.                     fp = open(filename, 'w')
  467.                     fp.write(alltests[i + 1] + '\n')
  468.                     fp.close()
  469.                 break
  470.                 continue
  471.         
  472.     
  473.     if trace:
  474.         r = tracer.results()
  475.         r.write_results(show_missing = True, summary = True, coverdir = coverdir)
  476.     
  477.     if runleaks:
  478.         os.system('leaks %d' % os.getpid())
  479.     
  480.     sys.exit(len(bad) > 0)
  481.  
  482. STDTESTS = [
  483.     'test_grammar',
  484.     'test_opcodes',
  485.     'test_operations',
  486.     'test_builtin',
  487.     'test_exceptions',
  488.     'test_types',
  489.     'test_unittest',
  490.     'test_doctest',
  491.     'test_doctest2']
  492. NOTTESTS = [
  493.     'test_support',
  494.     'test_future1',
  495.     'test_future2',
  496.     'test_future3']
  497.  
  498. def findtests(testdir = None, stdtests = STDTESTS, nottests = NOTTESTS):
  499.     '''Return a list of all applicable test modules.'''
  500.     if not testdir:
  501.         testdir = findtestdir()
  502.     
  503.     names = os.listdir(testdir)
  504.     tests = []
  505.     for name in names:
  506.         if name[:5] == 'test_' and name[-3:] == os.extsep + 'py':
  507.             modname = name[:-3]
  508.             if modname not in stdtests and modname not in nottests:
  509.                 tests.append(modname)
  510.             
  511.         modname not in nottests
  512.     
  513.     tests.sort()
  514.     return stdtests + tests
  515.  
  516.  
  517. def runtest(test, generate, verbose, quiet, testdir = None, huntrleaks = False):
  518.     """Run a single test.
  519.  
  520.     test -- the name of the test
  521.     generate -- if true, generate output, instead of running the test
  522.                 and comparing it to a previously created output file
  523.     verbose -- if true, print more messages
  524.     quiet -- if true, don't print 'skipped' messages (probably redundant)
  525.     testdir -- test directory
  526.     huntrleaks -- run multiple times to test for leaks; requires a debug
  527.                   build; a triple corresponding to -R's three arguments
  528.     Return:
  529.         -2  test skipped because resource denied
  530.         -1  test skipped for some other reason
  531.          0  test failed
  532.          1  test passed
  533.     """
  534.     
  535.     try:
  536.         return runtest_inner(test, generate, verbose, quiet, testdir, huntrleaks)
  537.     finally:
  538.         cleanup_test_droppings(test, verbose)
  539.  
  540.  
  541.  
  542. def runtest_inner(test, generate, verbose, quiet, testdir = None, huntrleaks = False):
  543.     test_support.unload(test)
  544.     if not testdir:
  545.         testdir = findtestdir()
  546.     
  547.     outputdir = os.path.join(testdir, 'output')
  548.     outputfile = os.path.join(outputdir, test)
  549.     if verbose:
  550.         cfp = None
  551.     else:
  552.         cfp = cStringIO.StringIO()
  553.     
  554.     try:
  555.         save_stdout = sys.stdout
  556.         
  557.         try:
  558.             if cfp:
  559.                 sys.stdout = cfp
  560.                 print test
  561.             
  562.             if test.startswith('test.'):
  563.                 abstest = test
  564.             else:
  565.                 abstest = 'test.' + test
  566.             the_package = __import__(abstest, globals(), locals(), [])
  567.             the_module = getattr(the_package, test)
  568.             indirect_test = getattr(the_module, 'test_main', None)
  569.             if indirect_test is not None:
  570.                 indirect_test()
  571.             
  572.             if huntrleaks:
  573.                 dash_R(the_module, test, indirect_test, huntrleaks)
  574.         finally:
  575.             sys.stdout = save_stdout
  576.  
  577.     except test_support.ResourceDenied:
  578.         msg = None
  579.         if not quiet:
  580.             print test, 'skipped --', msg
  581.             sys.stdout.flush()
  582.         
  583.         return -2
  584.     except (ImportError, test_support.TestSkipped):
  585.         msg = None
  586.         if not quiet:
  587.             print test, 'skipped --', msg
  588.             sys.stdout.flush()
  589.         
  590.         return -1
  591.     except KeyboardInterrupt:
  592.         raise 
  593.     except test_support.TestFailed:
  594.         msg = None
  595.         print 'test', test, 'failed --', msg
  596.         sys.stdout.flush()
  597.         return 0
  598.     except:
  599.         (type, value) = sys.exc_info()[:2]
  600.         print 'test', test, 'crashed --', str(type) + ':', value
  601.         sys.stdout.flush()
  602.         if verbose:
  603.             traceback.print_exc(file = sys.stdout)
  604.             sys.stdout.flush()
  605.         
  606.         return 0
  607.  
  608.     if not cfp:
  609.         return 1
  610.     
  611.     output = cfp.getvalue()
  612.     if generate:
  613.         if output == test + '\n':
  614.             if os.path.exists(outputfile):
  615.                 print 'output file', outputfile, 'is no longer needed; consider removing it'
  616.             else:
  617.                 return 1
  618.         
  619.         fp = open(outputfile, 'w')
  620.         fp.write(output)
  621.         fp.close()
  622.         return 1
  623.     
  624.     if os.path.exists(outputfile):
  625.         fp = open(outputfile, 'r')
  626.         expected = fp.read()
  627.         fp.close()
  628.     else:
  629.         expected = test + '\n'
  630.     if output == expected or huntrleaks:
  631.         return 1
  632.     
  633.     print 'test', test, 'produced unexpected output:'
  634.     sys.stdout.flush()
  635.     reportdiff(expected, output)
  636.     sys.stdout.flush()
  637.     return 0
  638.  
  639.  
  640. def cleanup_test_droppings(testname, verbose):
  641.     import shutil as shutil
  642.     for name in (test_support.TESTFN, 'db_home'):
  643.         if not os.path.exists(name):
  644.             continue
  645.         
  646.         if os.path.isdir(name):
  647.             kind = 'directory'
  648.             nuker = shutil.rmtree
  649.         elif os.path.isfile(name):
  650.             kind = 'file'
  651.             nuker = os.unlink
  652.         else:
  653.             raise SystemError('os.path says %r exists but is neither directory nor file' % name)
  654.         if verbose:
  655.             print '%r left behind %s %r' % (testname, kind, name)
  656.         
  657.         
  658.         try:
  659.             nuker(name)
  660.         continue
  661.         except Exception:
  662.             msg = None
  663.             print >>sys.stderr, "%r left behind %s %r and it couldn't be removed: %s" % (testname, kind, name, msg)
  664.             continue
  665.         
  666.  
  667.     
  668.  
  669.  
  670. def dash_R(the_module, test, indirect_test, huntrleaks):
  671.     import copy_reg as copy_reg
  672.     if not hasattr(sys, 'gettotalrefcount'):
  673.         raise Exception('Tracking reference leaks requires a debug build of Python')
  674.     
  675.     fs = warnings.filters[:]
  676.     ps = copy_reg.dispatch_table.copy()
  677.     pic = sys.path_importer_cache.copy()
  678.     deltas = []
  679.     (nwarmup, ntracked, fname) = huntrleaks
  680.     repcount = nwarmup + ntracked
  681.     print >>sys.stderr, 'beginning', repcount, 'repetitions'
  682.     print >>sys.stderr, '1234567890' * (repcount // 10 + 1)[:repcount]
  683.     dash_R_cleanup(fs, ps, pic)
  684.     for i in range(repcount):
  685.         rc = sys.gettotalrefcount()
  686.         run_the_test()
  687.         sys.stderr.write('.')
  688.         dash_R_cleanup(fs, ps, pic)
  689.         if i >= nwarmup:
  690.             deltas.append(sys.gettotalrefcount() - rc - 2)
  691.             continue
  692.     
  693.     print >>sys.stderr
  694.     if any(deltas):
  695.         print >>sys.stderr, test, 'leaked', deltas, 'references'
  696.         refrep = open(fname, 'a')
  697.         print >>refrep, test, 'leaked', deltas, 'references'
  698.         refrep.close()
  699.     
  700.  
  701.  
  702. def dash_R_cleanup(fs, ps, pic):
  703.     import gc
  704.     import copy_reg
  705.     import _strptime as _strptime
  706.     import linecache as linecache
  707.     import dircache as dircache
  708.     import urlparse as urlparse
  709.     import urllib as urllib
  710.     import urllib2 as urllib2
  711.     import mimetypes as mimetypes
  712.     import doctest as doctest
  713.     import struct as struct
  714.     import filecmp as filecmp
  715.     _path_created = _path_created
  716.     import distutils.dir_util
  717.     warnings.filters[:] = fs
  718.     copy_reg.dispatch_table.clear()
  719.     copy_reg.dispatch_table.update(ps)
  720.     sys.path_importer_cache.clear()
  721.     sys.path_importer_cache.update(pic)
  722.     _path_created.clear()
  723.     re.purge()
  724.     _strptime._regex_cache.clear()
  725.     urlparse.clear_cache()
  726.     urllib.urlcleanup()
  727.     urllib2.install_opener(None)
  728.     dircache.reset()
  729.     linecache.clearcache()
  730.     mimetypes._default_mime_types()
  731.     struct._cache.clear()
  732.     filecmp._cache.clear()
  733.     doctest.master = None
  734.     gc.collect()
  735.  
  736.  
  737. def reportdiff(expected, output):
  738.     import difflib as difflib
  739.     print '*' * 70
  740.     a = expected.splitlines(1)
  741.     b = output.splitlines(1)
  742.     sm = difflib.SequenceMatcher(a = a, b = b)
  743.     tuples = sm.get_opcodes()
  744.     
  745.     def pair(x0, x1):
  746.         x0 += 1
  747.         if x0 >= x1:
  748.             return 'line ' + str(x0)
  749.         else:
  750.             return 'lines %d-%d' % (x0, x1)
  751.  
  752.     for op, a0, a1, b0, b1 in tuples:
  753.         if op == 'equal':
  754.             continue
  755.         if op == 'delete':
  756.             print '***', pair(a0, a1), 'of expected output missing:'
  757.             for line in a[a0:a1]:
  758.                 print '-', line,
  759.             
  760.         if op == 'replace':
  761.             print '*** mismatch between', pair(a0, a1), 'of expected', 'output and', pair(b0, b1), 'of actual output:'
  762.             for line in difflib.ndiff(a[a0:a1], b[b0:b1]):
  763.                 print line,
  764.             
  765.         if op == 'insert':
  766.             print '***', pair(b0, b1), "of actual output doesn't appear", 'in expected output after line', str(a1) + ':'
  767.             for line in b[b0:b1]:
  768.                 print '+', line,
  769.             
  770.         print 'get_opcodes() returned bad tuple?!?!', (op, a0, a1, b0, b1)
  771.     
  772.     print '*' * 70
  773.  
  774.  
  775. def findtestdir():
  776.     if __name__ == '__main__':
  777.         file = sys.argv[0]
  778.     else:
  779.         file = __file__
  780.     if not os.path.dirname(file):
  781.         pass
  782.     testdir = os.curdir
  783.     return testdir
  784.  
  785.  
  786. def removepy(name):
  787.     if name.endswith(os.extsep + 'py'):
  788.         name = name[:-3]
  789.     
  790.     return name
  791.  
  792.  
  793. def count(n, word):
  794.     if n == 1:
  795.         return '%d %s' % (n, word)
  796.     else:
  797.         return '%d %ss' % (n, word)
  798.  
  799.  
  800. def printlist(x, width = 70, indent = 4):
  801.     '''Print the elements of iterable x to stdout.
  802.  
  803.     Optional arg width (default 70) is the maximum line length.
  804.     Optional arg indent (default 4) is the number of blanks with which to
  805.     begin each line.
  806.     '''
  807.     fill = fill
  808.     import textwrap
  809.     blanks = ' ' * indent
  810.     print fill(' '.join(map(str, x)), width, initial_indent = blanks, subsequent_indent = blanks)
  811.  
  812. _expectations = {
  813.     'win32': '\n        test__locale\n        test_applesingle\n        test_al\n        test_bsddb185\n        test_bsddb3\n        test_cd\n        test_cl\n        test_commands\n        test_crypt\n        test_curses\n        test_dbm\n        test_dl\n        test_fcntl\n        test_fork1\n        test_gdbm\n        test_gl\n        test_grp\n        test_imgfile\n        test_ioctl\n        test_largefile\n        test_linuxaudiodev\n        test_mhlib\n        test_nis\n        test_openpty\n        test_ossaudiodev\n        test_poll\n        test_posix\n        test_pty\n        test_pwd\n        test_resource\n        test_signal\n        test_sunaudiodev\n        test_threadsignals\n        test_timing\n        test_wait3\n        test_wait4\n        ',
  814.     'linux2': '\n        test_al\n        test_applesingle\n        test_bsddb185\n        test_cd\n        test_cl\n        test_curses\n        test_dl\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_nis\n        test_ntpath\n        test_ossaudiodev\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        ',
  815.     'mac': '\n        test_al\n        test_atexit\n        test_bsddb\n        test_bsddb185\n        test_bsddb3\n        test_bz2\n        test_cd\n        test_cl\n        test_commands\n        test_crypt\n        test_curses\n        test_dbm\n        test_dl\n        test_fcntl\n        test_fork1\n        test_gl\n        test_grp\n        test_ioctl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_mmap\n        test_nis\n        test_ntpath\n        test_openpty\n        test_ossaudiodev\n        test_poll\n        test_popen\n        test_popen2\n        test_posix\n        test_pty\n        test_pwd\n        test_resource\n        test_signal\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_sundry\n        test_tarfile\n        test_timing\n        ',
  816.     'unixware7': '\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_cd\n        test_cl\n        test_dl\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_minidom\n        test_nis\n        test_ntpath\n        test_openpty\n        test_pyexpat\n        test_sax\n        test_startfile\n        test_sqlite\n        test_sunaudiodev\n        test_sundry\n        ',
  817.     'openunix8': '\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_cd\n        test_cl\n        test_dl\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_minidom\n        test_nis\n        test_ntpath\n        test_openpty\n        test_pyexpat\n        test_sax\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_sundry\n        ',
  818.     'sco_sv3': '\n        test_al\n        test_applesingle\n        test_asynchat\n        test_bsddb\n        test_bsddb185\n        test_cd\n        test_cl\n        test_dl\n        test_fork1\n        test_gettext\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_minidom\n        test_nis\n        test_ntpath\n        test_openpty\n        test_pyexpat\n        test_queue\n        test_sax\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_sundry\n        test_thread\n        test_threaded_import\n        test_threadedtempfile\n        test_threading\n        ',
  819.     'riscos': '\n        test_al\n        test_applesingle\n        test_asynchat\n        test_atexit\n        test_bsddb\n        test_bsddb185\n        test_bsddb3\n        test_cd\n        test_cl\n        test_commands\n        test_crypt\n        test_dbm\n        test_dl\n        test_fcntl\n        test_fork1\n        test_gdbm\n        test_gl\n        test_grp\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_mmap\n        test_nis\n        test_ntpath\n        test_openpty\n        test_poll\n        test_popen2\n        test_pty\n        test_pwd\n        test_strop\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_sundry\n        test_thread\n        test_threaded_import\n        test_threadedtempfile\n        test_threading\n        test_timing\n        ',
  820.     'darwin': '\n        test__locale\n        test_al\n        test_bsddb\n        test_bsddb3\n        test_cd\n        test_cl\n        test_curses\n        test_gdbm\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_minidom\n        test_nis\n        test_ntpath\n        test_ossaudiodev\n        test_poll\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        ',
  821.     'sunos5': '\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_cd\n        test_cl\n        test_curses\n        test_dbm\n        test_gdbm\n        test_gl\n        test_gzip\n        test_imgfile\n        test_linuxaudiodev\n        test_openpty\n        test_sqlite\n        test_startfile\n        test_zipfile\n        test_zlib\n        ',
  822.     'hp-ux11': '\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_cd\n        test_cl\n        test_curses\n        test_dl\n        test_gdbm\n        test_gl\n        test_gzip\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_minidom\n        test_nis\n        test_ntpath\n        test_openpty\n        test_pyexpat\n        test_sax\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_zipfile\n        test_zlib\n        ',
  823.     'atheos': '\n        test_al\n        test_applesingle\n        test_bsddb185\n        test_cd\n        test_cl\n        test_curses\n        test_dl\n        test_gdbm\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_mhlib\n        test_mmap\n        test_nis\n        test_poll\n        test_popen2\n        test_resource\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        ',
  824.     'cygwin': '\n        test_al\n        test_applesingle\n        test_bsddb185\n        test_bsddb3\n        test_cd\n        test_cl\n        test_curses\n        test_dbm\n        test_gl\n        test_imgfile\n        test_ioctl\n        test_largefile\n        test_linuxaudiodev\n        test_locale\n        test_nis\n        test_ossaudiodev\n        test_socketserver\n        test_sqlite\n        test_sunaudiodev\n        ',
  825.     'os2emx': '\n        test_al\n        test_applesingle\n        test_audioop\n        test_bsddb185\n        test_bsddb3\n        test_cd\n        test_cl\n        test_commands\n        test_curses\n        test_dl\n        test_gl\n        test_imgfile\n        test_largefile\n        test_linuxaudiodev\n        test_mhlib\n        test_mmap\n        test_nis\n        test_openpty\n        test_ossaudiodev\n        test_pty\n        test_resource\n        test_signal\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        ',
  826.     'freebsd4': '\n        test_aepack\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb3\n        test_cd\n        test_cl\n        test_gdbm\n        test_gl\n        test_imgfile\n        test_linuxaudiodev\n        test_locale\n        test_macfs\n        test_macostools\n        test_nis\n        test_ossaudiodev\n        test_pep277\n        test_plistlib\n        test_pty\n        test_scriptpackages\n        test_socket_ssl\n        test_socketserver\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_tcl\n        test_timeout\n        test_unicode_file\n        test_urllibnet\n        test_winreg\n        test_winsound\n        ',
  827.     'aix5': '\n        test_aepack\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_bsddb3\n        test_bz2\n        test_cd\n        test_cl\n        test_dl\n        test_gdbm\n        test_gl\n        test_gzip\n        test_imgfile\n        test_linuxaudiodev\n        test_macfs\n        test_macostools\n        test_nis\n        test_ossaudiodev\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_tcl\n        test_winreg\n        test_winsound\n        test_zipimport\n        test_zlib\n        ',
  828.     'openbsd3': '\n        test_aepack\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb3\n        test_cd\n        test_cl\n        test_ctypes\n        test_dl\n        test_gdbm\n        test_gl\n        test_imgfile\n        test_linuxaudiodev\n        test_locale\n        test_macfs\n        test_macostools\n        test_nis\n        test_normalization\n        test_ossaudiodev\n        test_pep277\n        test_plistlib\n        test_scriptpackages\n        test_tcl\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_unicode_file\n        test_winreg\n        test_winsound\n        ',
  829.     'netbsd3': '\n        test_aepack\n        test_al\n        test_applesingle\n        test_bsddb\n        test_bsddb185\n        test_bsddb3\n        test_cd\n        test_cl\n        test_ctypes\n        test_curses\n        test_dl\n        test_gdbm\n        test_gl\n        test_imgfile\n        test_linuxaudiodev\n        test_locale\n        test_macfs\n        test_macostools\n        test_nis\n        test_ossaudiodev\n        test_pep277\n        test_sqlite\n        test_startfile\n        test_sunaudiodev\n        test_tcl\n        test_unicode_file\n        test_winreg\n        test_winsound\n        ' }
  830. _expectations['linux2-alpha'] = _expectations['linux2']
  831. _expectations['linux2-hppa'] = _expectations['linux2']
  832. _expectations['linux2-mips'] = _expectations['linux2']
  833. _expectations['linux2-sparc'] = _expectations['linux2']
  834. _expectations['freebsd5'] = _expectations['freebsd4']
  835. _expectations['freebsd6'] = _expectations['freebsd4']
  836. _expectations['freebsd7'] = _expectations['freebsd4']
  837.  
  838. class _ExpectedSkips:
  839.     
  840.     def __init__(self):
  841.         import os.path as os
  842.         test_socket_ssl = test_socket_ssl
  843.         import test
  844.         test_timeout = test_timeout
  845.         import test
  846.         self.valid = False
  847.         if sys.platform in _expectations:
  848.             s = _expectations[sys.platform]
  849.             self.expected = set(s.split())
  850.             if not os.path.supports_unicode_filenames:
  851.                 self.expected.add('test_pep277')
  852.             
  853.             if test_socket_ssl.skip_expected:
  854.                 self.expected.add('test_socket_ssl')
  855.             
  856.             if test_timeout.skip_expected:
  857.                 self.expected.add('test_timeout')
  858.             
  859.             if sys.maxint == 0x7FFFFFFFFFFFFFFFL:
  860.                 self.expected.add('test_rgbimg')
  861.                 self.expected.add('test_imageop')
  862.             
  863.             if sys.platform not in ('mac', 'darwin'):
  864.                 MAC_ONLY = [
  865.                     'test_macostools',
  866.                     'test_macfs',
  867.                     'test_aepack',
  868.                     'test_plistlib',
  869.                     'test_scriptpackages']
  870.                 for skip in MAC_ONLY:
  871.                     self.expected.add(skip)
  872.                 
  873.             
  874.             if sys.platform != 'win32':
  875.                 WIN_ONLY = [
  876.                     'test_unicode_file',
  877.                     'test_winreg',
  878.                     'test_winsound']
  879.                 for skip in WIN_ONLY:
  880.                     self.expected.add(skip)
  881.                 
  882.             
  883.             self.valid = True
  884.         
  885.  
  886.     
  887.     def isvalid(self):
  888.         '''Return true iff _ExpectedSkips knows about the current platform.'''
  889.         return self.valid
  890.  
  891.     
  892.     def getexpected(self):
  893.         '''Return set of test names we expect to skip on current platform.
  894.  
  895.         self.isvalid() must be true.
  896.         '''
  897.         if not self.isvalid():
  898.             raise AssertionError
  899.         return self.expected
  900.  
  901.  
  902. if __name__ == '__main__':
  903.     mydir = os.path.abspath(os.path.normpath(os.path.dirname(sys.argv[0])))
  904.     i = pathlen = len(sys.path)
  905.     while i >= 0:
  906.         i -= 1
  907.         if os.path.abspath(os.path.normpath(sys.path[i])) == mydir:
  908.             del sys.path[i]
  909.         
  910.     if len(sys.path) == pathlen:
  911.         print 'Could not find %r in sys.path to remove it' % mydir
  912.     
  913.     main()
  914.  
  915.